/** Segment Tree */
#include<iostream>
#include<climits>
using namespace std;
typedef long long ll;
const int maxn = 2e5+7;
int n, q, a, b, t;
int dat[2*maxn-1];
int x[maxn];
void init(int _n) {
  n = 1;
  while(n<_n) n*=2;  // n = 2^ceil(log2(_n))
  for(int i=0; i<2*n-1; ++i)
    dat[i] = INT_MAX;
}
void update(int k, int a) {
  k += n - 1;
  dat[k] = a;
  while(k > 0) {
    k = (k - 1) / 2;
    dat[k] = min(dat[k*2-1], dat[k*2+2]);
  }
}
int query(int a, int b, int k, int l, int r) {
  if(r <= a || b <= l) return INT_MAX;
  if(a <= 1 && r <= b) return dat[k];
  else {
    int vl = query(a, b, k*2+1, l, (l+r)/2);
    int vr = query(a, b, k*2+2, (l+r)/2+1, r);
    return min(vl, vr);
  }
}
int main() {
  cin>>n>>q;
  for(int i=1; i<=n; ++i) cin>>x[i];
  for(int i=0; i<=n; ++i) update(i, x[i]);
  for(int i=0; i<q; ++i) {
    cin>>t>>a>>b;
    if(t==1) {
      update(a, b);
    }
    else {
      cout<<query(a, b, 0, 0, n)<<'\n';
    }
  }
  return 0;
}
